//打印信息到控制台、log中
//例：mjl_log("This is log");
//mjl_log("日志");
[register]
void mjl_log(char* msg);

enum TURN_TYPE
{
	TURN_FRONT,
	TURN_LEFT,
	TURN_RIGHT,
	TURN_BACK,
};
enum TRIGGER_TYPE
{
	TRIGGER_NONE,
	TRIGGER_PHY,
	TRIGGER_PHY_SCRIPT,
	TRIGGER_MAX
};
enum HERO_DRESS_ITEM
{
	HERO_DRESS_zhuang_shi_1,//装饰1
	HERO_DRESS_zhuang_shi_2,//装饰2
	HERO_DRESS_hu_wan,//护腕
	HERO_DRESS_xie_zi,//脚蹬
	HERO_DRESS_wu_qi,//手持
	HERO_DRESS_yi_fu,//身穿
	HERO_DRESS_hu_jia,//肩披
	HERO_DRESS_tou_dai,//头戴，比如发带
	HERO_DRESS_MAX
};

//将int转为字符串
[register]
char* mjl_int2Str(int v);

//将float转为字符串
[register]
char* mjl_flt2Str(float v);

//融合两个字符串为一个
[register]
char* mjl_mergeStr(char* a, char* b);
//比较2个字符串，如果相同，则返回true，否则返回false
//例如：
//	if (mjl_matchStr(mjl_getMainHero(), "liu_qing_feng"))
//	{
//		mjl_msg("OK", 1.2f);
//	}
//	else
//	{
//		mjl_msg("NO", 1.2f);
//	}
[register]
bool mjl_matchStr(char* a, char* b);

//幂函数
[register]
float mjl_pow(float v, int power);


//获取当前地图名字，比如“三清宫”
//可以进行字符串比较，如
//if (mjl_matchStr(mjl_getCurrentMapName(),"百草地"))
//{
	//mjl_log("HIT");
//}
[register]
char* mjl_getCurrentMapName();

//获取当前地图内部名称，比如“sqg_bai_cao_di_0”
[register]
char* mjl_getCurrentMapNameGame();

//获取当前主要角色[就是你操控的、显示在地图上的角色]的名字，可以修改的，修改后，角色形象也会变，下面有函数可以操作
[register]
char* mjl_getMainHero();

//获得角色形象所用的NPC名字，NPC位于anim/npc/目录下
//hero_name:角色名字，如:liu_qing_feng
[register]
char* mjl_getHeroNpc(char* hero_name);

//设置角色形象所用的NPC名字，NPC位于anim/npc/目录下
//hero_name:角色名字，如:liu_qing_feng
//例如:mjl_setHeroNpc("liu_qing_feng", "da_shi_xiong");变为大师兄NPC形象
[register]
bool mjl_setHeroNpc(char* hero_name, char* npc_name);

//获得主角战斗形象
//hero_name:角色名字，如:liu_qing_feng
[register]
char* mjl_getHeroFighter(char* hero_name);

//设置主角战斗形象
//例如:mjl_setHeroFighter("liu_qing_feng", "da_shi_xiong");变为大师兄战斗形象
[register]
bool mjl_setHeroFighter(char* hero_name, char* fighter_name);

//获取特定角色的等级
[register]
int mjl_getHeroLevel(char* hero_name);

//设置特定角色的等级
[register]
void mjl_setHeroLevel(char* hero_name, int level);

//获取特定角色的当前经验上限
[register]
int mjl_getHeroExpLimit(char* hero_name);

//设置特定角色的当前经验上限
[register]
void mjl_setHeroExpLimit(char* hero_name, int exp);

//获取特定角色的当前经验
[register]
int mjl_getHeroExp(char* hero_name);

//设置特定角色的当前经验
[register]
void mjl_setHeroExp(char* hero_name, int exp);

//增加指定角色的经验
void mjl_addHeroExp(char* hero_name, int exp)
{ 
	int cur = mjl_getHeroExp(hero_name);
	mjl_setHeroExp(hero_name, exp + cur);
}
//获取特定角色的当前血量上限
[register]
int mjl_getHeroHPLimit(char* hero_name);

//设置特定角色的当前血量上限
[register]
void mjl_setHeroHPLimit(char* hero_name, int v);

//获取特定角色的当前法力上限
[register]
int mjl_getHeroMPLimit(char* hero_name);

//设置特定角色的当前法力上限
[register]
void mjl_setHeroMPLimit(char* hero_name, int v);

//获取特定角色的当前血量
[register]
int mjl_getHeroHP(char* hero_name);

//设置特定角色的当前血量
[register]
void mjl_setHeroHP(char* hero_name, int v);

//获取特定角色的当前法力
[register]
int mjl_getHeroMP(char* hero_name);

//设置特定角色的当前法力
[register]
void mjl_setHeroMP(char* hero_name, int v);

//获取特定角色的当前攻击力
[register]
int mjl_getHeroAtk(char* hero_name);

//设置特定角色的当前攻击力
[register]
void mjl_setHeroAtk(char* hero_name, int v);

//获取特定角色的当前防御
[register]
int mjl_getHeroDfd(char* hero_name);

//设置特定角色的当前防御
[register]
void mjl_setHeroDfd(char* hero_name, int v);

//获取特定角色的当前身法
[register]
int mjl_getHeroBody(char* hero_name);

//设置特定角色的当前身法
[register]
void mjl_setHeroBody(char* hero_name, int v);

//获取特定角色的当前灵力
[register]
int mjl_getHeroMana(char* hero_name);

//设置特定角色的当前灵力
[register]
void mjl_setHeroMana(char* hero_name, int v);

//获取特定角色的当前吉运
[register]
int mjl_getHeroLuck(char* hero_name);

//设置特定角色的当前吉运
[register]
void mjl_setHeroLuck(char* hero_name, int v);

//为主角提高hp、mp上限
[register]
void mjl_addHpMpLimit(char* hero_name, int hp, int mp);

//提高攻击上限，如：mjl_addAtkLimit("liu_qing_feng", 1000);
[register]
void mjl_addAtkLimit(char* hero_name, int v);

//提高防御上限，如：mjl_addDfdLimit("liu_qing_feng", 1000);
[register]
void mjl_addDfdLimit(char* hero_name, int v);

//提高身法上限，如：mjl_addBodyLimit("liu_qing_feng", 1000);
[register]
void mjl_addBodyLimit(char* hero_name, int v);

//提高吉运上限，如：mjl_addLuckLimit("liu_qing_feng", 1000);
[register]
void mjl_addLuckLimit(char* hero_name, int v);

//提高灵力上限，如：mjl_addManaLimit("liu_qing_feng", 1000);
[register]
void mjl_addManaLimit(char* hero_name, int v);

//获取特定角色的当前经验上限，佩戴装备后的数值
[register]
int mjl_getHeroExpLimitWithEquipment(char* hero_name);

//获取特定角色的当前经验，佩戴装备后的数值
[register]
int mjl_getHeroExpWithEquipment(char* hero_name);

//获取特定角色的当前血量上限，佩戴装备后的数值
[register]
int mjl_getHeroHPLimitWithEquipment(char* hero_name);

//获取特定角色的当前法力上限，佩戴装备后的数值
[register]
int mjl_getHeroMPLimitWithEquipment(char* hero_name);

//获取特定角色的当前血量，佩戴装备后的数值
[register]
int mjl_getHeroHPWithEquipment(char* hero_name);

//获取特定角色的当前法力，佩戴装备后的数值
[register]
int mjl_getHeroMPWithEquipment(char* hero_name);

//获取特定角色的当前攻击力，佩戴装备后的数值
[register]
int mjl_getHeroAtkWithEquipment(char* hero_name);

//获取特定角色的当前防御，佩戴装备后的数值
[register]
int mjl_getHeroDfdWithEquipment(char* hero_name);

//获取特定角色的当前身法，佩戴装备后的数值
[register]
int mjl_getHeroBodyWithEquipment(char* hero_name);

//获取特定角色的当前灵力，佩戴装备后的数值
[register]
int mjl_getHeroManaWithEquipment(char* hero_name);

//获取特定角色的当前吉运，佩戴装备后的数值
[register]
int mjl_getHeroLuckWithEquipment(char* hero_name);


//清空背包中所有物品
[register]
void mjl_clearAllBagItems();

//获取当前存档的运行时间，单位：秒
[register]
float mjl_getTime();

//加载游戏地图，比如mjl_loadMap("map/sqg_bai_cao_di/0.map");加载百草地地图
[register]
void mjl_loadMap(char* path);

//加载一个npc到地图上，例：mjl_loadNpc("you_ren_1", "t1", true, "map/san_qing_gong/npc_1.c");
//you_ren_1：NPC角色，位于anim\npc下，自己查看
//t1：给这个NPC起个名字，用于操作NPC，比如为其设置位置mjl_setPos("t1", "pos_0");
//true：是否可以自由行走，true表示可以，false表示原地不动
//"map/san_qing_gong/npc_1.c"：为NPC添加脚本，与NPC对话触发此脚本
[register]
void mjl_loadNpc(char* dir, char* name, bool bWalk, char* script);

/*
	name:npc的名字
	TRIGGER_NONE:没有物理碰撞，也没有脚本触发
	TRIGGER_PHY：物理碰撞
	TRIGGER_PHY_SCRIPT：触发脚本且物理碰撞
*/
[register]
void mjl_setNpcTriggerType(char* name, TRIGGER_TYPE tp);

//运行与map绑定的main.c脚本，每张地图目录都有main.c，与map绑定
[register]
void mjl_runMapScript();

//运行一个脚本文件，例：mjl_runScript("map/sqg_bai_cao_di/anim.c");
[register]
void mjl_runScript(char* script);

//让主角或者NPC转向
[register]
void mjl_turn(char* name, TURN_TYPE d);

//显示一个消息，如mjl_msg("获得：乌龙剑", 1.2f);
//1.2f：表示显示时间持续1.2秒
[register]
void mjl_msg(char* msg, float t);

//显示一个消息，消息为地图名字
[register]
void mjl_msgMap(float t);

//移动物品：主角、NPC、其他图片等，dx：水平位移，dy垂直位移
[register]
void mjl_moveBy(char* name, int dx, int dy);

//滑动的移动一个物品到指定的位置，pos需要在编辑器中设定，是一个网格的名称，time：移动持续的时间
//例:mjl_slideTo("liu_qing_feng", "pos_0",1.2f);
[register]
void mjl_slideTo(char* name, char* pos, float time);//time>0.4f


//滑动的移动一个物品到指定的位置，dx：水平位移，dy垂直位移
[register]
void mjl_slideBy(char* name, int dx, int dy, float time);

//随机移动角色到某个位置
[register]
void mjl_slideToRandom(char* name, float time);//time>0.4f

//设置角色、NPC等到指定位置
[register]
void mjl_setPos(char* name, char* posID);

//显示一张图片，例：mjl_showTex("tex/game/hu_die/1.png", "t1", "hd_0", 100);

//"tex/game/hu_die/1.png"：图片路径
//"t1"：给图片起名
//"hd_0"：把图片放到地图上的"hd_0"位置
//100：ZOrder很高，不会被其他物品遮挡
//ZOrder<0，表示自动更新ZOrder
[register]
void mjl_showTex(char* path, char* name, char* pos, int ZOrder);

//"tex/game/hu_die/1.png"：图片路径
//"t1"：给图片起名
//anchor_x，anchor_y：图片的锚点，[0,0]表示图片左下角，[0.5,0.5]表示图片中心为锚点
//x，y：屏幕位置，[0,0]表示把图片放到屏幕左下角，[0.5,0.5]表示中心
//任意按键，图片消失，继续运行脚本
//例子：mjl_showTexOnScreen("tex/ui/qq_share.png","tt", 0.5f, 0.5f, 0.5f, 0.5f);
[register]
void mjl_showTexOnScreen(char* path, char* name, float anchor_x, float anchor_y, float x, float y);

//销毁一个物品
[register]
void mjl_destroy(char* name);

//显示对话，name：必须是主角，否则直接空着，例:
//mjl_say("liu_qing_feng", "小蝴蝶..")
//mjl_say("","商人：道家圣地！");
[register]
void mjl_say(char* name, char* content);

//全屏显示文字，用法类似mjl_say， font_sz表示字体大小
[register]
void mjl_say_board(char* content, int font_sz);

//用于npc对话，mjl_say_npc("商人", "道家圣地！");
[register]
void mjl_say_npc(char* name, char* str);

//冰冻住操作的角色，无法移动，v：true表示冰冻，false表示解冻
[register]
void mjl_freeze(bool v);

//暂停脚本一段时间,mjl_wait(1.2f)，暂停1.2秒
[register]
void mjl_wait(float t);

//物品是否获得，例：mjl_isItemGet("ba_gua_jing", true)
//"ba_gua_jing"：是否获得了八卦镜
//true：如果没有获得，那么获得它，并且记录，如果是false：就单纯查询是否获得
[register]
bool mjl_isItemGet(char* item_name, bool ifNotGet_Get);

//添加物品到背包，mjl_addItem("ba_gua_jing", 1)，表示添加一个八卦镜
[register]
void mjl_addItem(char* item_name, int cnt);

//从背包里删除一个物品
[register]
void mjl_delItem(char* item_name, int cnt);

//增加金钱
[register]
void mjl_addMoney(int cnt);

//设置金钱
[register]
void mjl_setMoney(int cnt);

//获取现有金钱数目
[register]
int mjl_getMoney();

//根据id获得角色法术名字,例：mjl_getMagicNameByID("liu_qing_feng", 0)
/*遍历角色所有法术
	int cnt = mjl_getMagicCount(hero);
	int i = 0;
	for ( i = 0; i < cnt; i++)
	{
		mjl_msg(mjl_getMagicNameByID(hero, i), 1.2f);
		mjl_wait(1.2f);
	}
*/
[register]
char* mjl_getMagicNameByID(char* hero_name, int id);
//获得角色法术数量,例：mjl_getMagicCount("liu_qing_feng")
[register]
int mjl_getMagicCount(char* hero_name);
//判断角色法术是否存在,例：mjl_isMagicExist("liu_qing_feng","fei_jian_zhan")
[register]
bool mjl_isMagicGet(char* hero_name, char* magic_name);
//为角色添加一个法术,例：mjl_addMagic("liu_qing_feng","fei_jian_zhan")
[register]
void mjl_addMagic(char* hero_name, char* magic_name);

//删除角色一个法术,例：mjl_delMagic(mjl_getMainHero(), "pei_yuan_shu");
[register]
bool mjl_delMagic(char* hero_name, char* magic_name);

//在战斗中动态设置一个角色的特点法术是否可用，此函数仅在战斗中起效，非战斗状态无效
[register]
void mjl_setMagicEnableInFighting(char* hero_name, char* magic_name, bool enable);
//在战斗中判断一个角色的特点法术是否可用，此函数仅在战斗中起效，非战斗状态无效
[register]
bool mjl_isMagicEnableInFighting(char* hero_name, char* magic_name);

//删除角色所有法术
[register]
bool mjl_delAllMagic(char* hero_name);

//查询一个标志，防止重复执行一些代码
//关于参数：ifNotGet_Get
//true：查询标志是否设置，如果设置了，返回结果true；如果没有设置，就设置他，返回结果false
//false：查询标志是否设置，如果设置了，返回true；如果没有，返回false
//例：mjl_isFlagGet("chi_fan", true)，chi_fan这个标志设置了么，true表示如果没有设置标志，就设置为true
[register]
bool mjl_isFlagGet(char* name, bool ifNotGet_Get);
//查询一个标志是否设置
[register]
bool mjl_isFlag(char* name);
//设置一个标记的状态
[register]
void mjl_setFlag(char* name, bool bSet);

//删除一个标记，如果成功返回true，否则返回false
[register]
bool mjl_delFlag(char* name);

//删除所有标记
[register]
void mjl_delAllFlag();

//获得当前存档标记的总数，包括设置为true或者false的
[register]
int mjl_getFlagCount();

//根据id获取对应标记的名称，如果id非法，返回""，使用样例：
/*
int i = 0;
int cnt = mjl_getFlagCount();
char* name;
for (i = 0; i < cnt; i++)
{
	name = mjl_getFlagNameByID(i);
	if (mjl_matchStr(name, "xxx"))
	{
		//do ....
	}
}
*/
[register]
char* mjl_getFlagNameByID(int id);

//角色是否装备某件装备
[register]
bool mjl_isEquiped(char* name, char* item_name);

//获得背包里某个物品的数量
[register]
int mjl_getItemCount(char* item_name);

//设置地图的随机野怪配置
[register]
void mjl_setFightConfig(char* fight_config_name);

//设置战斗背景
[register]
void mjl_setFightBg(char* fight_bg);

//设置地图某个位置是否物理阻隔
[register]
void mjl_setPhy(char* id, bool bPhy);

//打开购买界面，用于角色在药店、武器店购买物品
[register]
void mjl_openBuy(char* config);

//打开当铺
[register]
bool mjl_openSell();//没有物品返回false

//判断所有角色是否状态全满
[register]
bool mjl_isStatePerfect(bool bRestore);

//与boss战斗，例mjl_fight("hu_deng_shou,hu_jian_shen,hu_deng_shou", true);
//与护灯兽、护剑神、护灯兽战斗，true表示失败后gameover，false则不会
[register]
void mjl_fight(char* enemy_array, bool bDead);

//与mjl_fight功能类似，增加的power可以调整本次战斗的所有敌人的hp、mp、atk、dfd、body、mana、luck参数，不影响敌人等级、奖励的经验、金钱、物品掉落概率等
//power为1.0f表示正常难度
//power为0.9f，表示敌人参数为正常的90%，其他情况类似，数字必须加f，否则结果不可控
[register]
void mjl_fightWithPower(char* enemy_array, float power, bool bDead);

//战斗是否失败了
[register]
bool mjl_isFightLose();//return 1:win;0:lose

//为物品设置缩放
[register]
void mjl_setScale(char* name, float x, float y);

//播放一个动画，例：mjl_playAnim("t1", "deng", "pos_0", -1);
//播放灯的动画
[register]
void mjl_playAnim(char* name, char* anim, char* pos, int ZOrder);//ZOrder<0±íÊ¾×Ô¶¯¸üÐÂ

//停止动画
[register]
void mjl_stopAnim(char* name);

//继续动画
[register]
void mjl_resumeAnim(char* name);

//播放一个特效，例：mjl_playSpe("t","di_dong_shan_yao", "pos_2", false, false);
//播放地动山摇特效，bLoop：表示是否循环播放，isPosNameObj：表示pos_name代表的是地图的位置还是某个物品的位置
[register]
void mjl_playSpe(char* name, char* spe, char* pos_name, bool bLoop, bool isPosNameObj);

//设置物品是否可见
[register] 
void mjl_setVisible(char* name, bool v);

//设置state物品的开关，比如门、宝箱
[register]
void mjl_setOpen(char* name, bool v);

//state物品是否处于打开的状态
[register]
bool mjl_isOpen(char* name);

//设置主角色，就是操控的角色，例：mjl_setMainHero("mu_rong_xiao_mei")，把慕容小梅设置为当前操控角色
//注意，使用全新角色是，要先调用mjl_setHeroActive("mu_rong_xiao_mei", true)，加载这个角色，否则会报错
[register]
void mjl_setMainHero(char* name);

//设置一个主角是否在队伍中
[register]
void mjl_setHeroActive(char* name, bool v);

//判断角色是否在队伍中，如果非active，则不参与战斗、形象展示
[register]
bool mjl_isHeroActive(char* name);

//设置是否在地图上显示队伍列表npc形象，仅显示已active的角色的npc形象
//设置为true，会导致现有已显示的队列npc形象重置，包括其位置、朝向等信息
//设置为false，清空地图上显示的队伍npc
//如果连续设置多次同样参数，会被忽略
[register]
void mjl_setShowHeroNPCQueue(bool v);

//判断是否在地图上显示队伍列表npc形象
[register]
bool mjl_isShowHeroNPCQueue();

//重置角色npc形象，如果当前是队伍列表npc形象，则位置、朝向统一与主角一致
[register]
void mjl_restructHero();

//获取当前队伍中激活的角色的数量
[register]
int mjl_getHeroActiveCount();

//弹出选择对话框,例：int i = mjl_select("购买,取消", true)
//i为0，表示选择[购买]，为1表示选择[取消]
//bEsc：表示按esc键是否隐藏选择对话框
[register]
int mjl_select(char* item, bool bEsc);

//获得一个0~1直接的随机数
[register]
float mjl_rand0_1();

//切场，例：mjl_qieChang("第二天")
[register]
void mjl_qieChang(char* msg);

//结束游戏，bFinish：是否播放结束动画
[register]
void mjl_gameOver(bool bFinish);

//清理无用的图片缓存
[register]
void mjl_clearTextureCache();

//获取当前难度等级,0:难度1,1:难度2,2:难度3
[register]
int mjl_getDifficultID();

//获得当前难度等级下，通关次数
[register]
int mjl_getPlayOverCount(int difficult_id);

//设定摄像机跟随
[register]
void mjl_setCamFocus(char* name, bool bImmediately);

//显示一个学习法术的面板，只用于显示，不能真正为角色添加法术
//hero_name:角色名字，如：柳清风
//magic_name:法术名字，如：飞剑斩
//dt:显示持续时间
[register]
void mjl_showMagicLearn(char* hero_name, char* magic_name, float dt);

//左上角的角色坐标是否显示
[register]
bool mjl_isEnableShowCoordinate();

//设置左上角的角色坐标是否显示，true表示显示，false不显示
//只需设置一次即可，不用每张地图都设置，此功能全局有效
[register]
void mjl_setEnableShowCoordinate(bool v);

//判断是否允许保存存档
[register]
bool mjl_isEnableSave();

//设置是否允许保存存档
[register]
void mjl_setEnableSave(bool v);

//播放bgm，仅支持ogg，建议44100kHz+双通道+每通道8位
//bgm_path：bgm路径
//bLoop表示是否循环播放
//例：mjl_playBGM("audio/bgm/bgm.ogg", true)
[register]
void mjl_playBGM(char* bgm_path, bool bLoop);

//停止bgm
//bgm_path：bgm路径
[register]
void mjl_stopBGM(char* bgm_path);

//用于累积数值，比如好感度
//name:一个自定义的名字，比如:hao_gan；
//v：一个整数，比如代表好感度
//举例：
//char* my_flag = "hao_gan";
//int v = mjl_getNameInt(my_flag);
//mjl_setNameInt(my_flag, v + 1);
[register]
bool mjl_setNameInt(char* name, int v);
[register]
int mjl_getNameInt(char* name);

////用于累积浮点数的数值，比如时间
//name:一个自定义的名字，比如:cur_time；
//v：一个浮点数，即小数，比如代表时间
//举例：
//char* my_flag = "hao_gan";
//float v = mjl_getNameFloat(my_flag);
//mjl_setNameFloat(my_flag, v + 1.0f);
[register]
bool mjl_setNameFloat(char* name, float v);
[register]
float mjl_getNameFloat(char* name);


//获得角色穿戴物品的名字
//hero_name:角色名字，如:liu_qing_feng
//type:穿戴类型，如HERO_DRESS_zhuang_shi_1
[register]
char* mjl_getHeroEquipment(char* hero_name, HERO_DRESS_ITEM type);

//设置角色穿戴
//hero_name:角色名字，如:liu_qing_feng
//type:穿戴类型，如HERO_DRESS_zhuang_shi_1
//equipment_name:穿戴物品的名字，如"ping_an_fu"
//如果物品设置成功，返回true，否则false
//失败可能的原因：物品不存在；物品的类型与穿戴要求的类型不匹配
[register]
bool mjl_setHeroEquipment(char* hero_name, HERO_DRESS_ITEM type, char* equipment_name);

//从背包中拿出一件装备，设置给角色，背包中物品数量-1
bool mjl_loadHeroEquipment(char* hero_name, HERO_DRESS_ITEM type, char* equipment_name)
{
	if (mjl_matchStr(equipment_name, ""))
	{
		return false;
	}
	int num = mjl_getItemCount(equipment_name);
	char* log;
	if (num <= 0)
	{
		//说明背包里没有这个装备物品
		log = mjl_mergeStr(equipment_name, " not exist in bag");
		mjl_log(log);
		return false;
	}
	if (mjl_setHeroEquipment(hero_name, type, equipment_name))
	{
		mjl_delItem(equipment_name, 1);
		return true;
	}
	return false;
}
//卸载角色装备，并将装备放回背包
bool mjl_unloadHeroEquipment(char* hero_name, HERO_DRESS_ITEM type)
{
	char* item_name = mjl_getHeroEquipment(hero_name, type);
	if (mjl_matchStr(item_name, ""))
	{
		//说明装备为空，直接返回
		return true;
	}
	if (mjl_setHeroEquipment(hero_name, type, ""))
	{
		mjl_addItem(item_name, 1);
		return true;
	}
	return false;
}
